﻿# Настройка мобильной службы Azure
---------------------------------
В данной работе вы настроите мобильную службу Azure для использования в последующих работах.

## Создание мобильной службы

1. Зайдите на [портал Microsoft Azure](http://manage.windowsazure.com), используя вашу учетную запись.

2. Перейдите в раздел **Мобильные службы** и нажмите кнопку **Создать** слева внизу страницы.

3. В появившемся меню снова выберите **Создать** и в появившейся форма введите название мобильной службы (придумайте свое, 
в дальнейшем мы будем ссылаться на него как *<имя вашей мобильной службы>*). Имя должно быть уникальным. Если это не так, вы увидите восклицательный знак справа от поля ввода. Выберите регион, который ближе всего к вам, а тип сервера - **JavaScript**. Настройте остальные параметры по своему усмотрению. Если затрудняетесь, 
оставьте их, как на рисунке ниже.
<p align="center"><img src="images\new_mob_service_1.jpg" width=80%/></p>
Перейдите ко второму шагу мастера, нажав справа внизу кнопку со стрелкой.

4. На втором шаге в поле **Имя** укажите имя базы данных для мобильной службы. Ниже вы можете выбрать существующий сервер SQL или создать новый. Для целей данного руководства мы создадим новый сервер (выберите **Создать сервер базы данных SQL**). Придумайте имя и пароль для входа на сервер и введите их в соответствующие поля. Выберите регион и настройте остальные параметры. Если затрудняетесь, оставьте их как на рисунке ниже (однако, вам все же придется придумать пароль). Нажмите кнопку с галочкой.
<p align="center"><img src="images\new_mob_service_2.jpg" width=80%/></p>

5. По завершению создания мобильной службы в соответствующей панели появится информация о ней.
<p align="center"><img src="images\mob_service_info.jpg" width=90%/></p>

## Создание таблицы для хранения данных

1. Кликните по названию мобильной службы. Вы попадете на стартовый экран мобильной службы.

2. В строке меню кликните пункт **Данные** и на появившейся странице - **Добавить таблицу**.

3. На странице появившегося мастера укажите имя таблицы (вам необходимо придумать свое, в дальнейшем будем ссылаться на него как *<имя вашей таблицы данных>*). Остальные параметры установите, как на рисунке. Нажмите кнопку с галочкой.
<p align="center"><img src="images\mob_service_new_table.jpg" width=90%/></p>
> **Важно:** В дальнейшем имя таблицы будет использовано в исходном коде мобильного приложения на C#, поэтому старайтесь выбрать такое имя, которое не приведет к соответствующим конфликтам. Если сомневаетесь, выберите имя, указанное на рисунке.

4. Кликните по имени созданной таблицы, чтобы перейти к ее настройке. Откроется страница **Обзор** с сообщением об отсутствии записей.

## Настройка разрешений таблицы 

Перейдите к странице **Разрешения** и убедитесь, что для таблицы установлены разрешения, как на рисунке ниже. Если это не так, установите их, чтобы они соответствовали рисунку.
<p align="center"><img src="images\table_permissions.jpg" width=90%/></p>

## Создание столбцов

1. Перейдите к странице **Столбцы** и ознакомьтесь со столбцами, создаваемыми по умолчанию.

2. Внизу страницы нажмите **Добавить столбец** и в появившемся окне выберите тип данных **String**, а имя столбца укажите **deviceid**. В этом столбце будет храниться строковый идентификатор устройства. Нажмите кнопку с галочкой, чтобы добавить столбец.

3. Аналогично предыдущему пункту добавьте в таблицу столбец **userid** типа **string** и столбцы **t**, **rh**, **led0**, **led1** типа **number**. Информация о будущем использовании всех столбцов приведена ниже.

| **Имя столбца** | **Назначение** | **Направление данных** |
|-----------------|----------------|------------------------|
| deviceid | Идентификатор устройства | От tessel в таблицу |
| userid | Идентификатор пользователя - зарезервировано для будущего использования | От tessel в таблицу |
| t | Температура воздуха в &deg;C | От tessel в таблицу |
| rh | Относительная влажность воздуха в % | От tessel в таблицу |
| led0 | Состояние первого светодиода tessel | От таблицы к tessel |
| led1 | Состояние второго светодиода tessel | От таблицы к tessel |

После создания столбцов страница **Столбцы** в Azure будет выглядеть, как показано на рисунке ниже.
<p align="center"><img src="images\table_columns.jpg" width=90%/></p>

## Создание и настройка API мобильной службы

1. От интерфейса таблицы перейдите к мобильной службе, нажав круглую кнопку со стрелкой "Назад".

2. Кликните на странице **API**, а затем - **Создать настраиваемый API**.

3. На появившейся странице мастера введите имя API (вам нужно придумать свое уникальное имя, в дальнейшем будем ссылаться на него как *<имя вашего мобильного API>*). Установите разрешения для API, как указано на рисунке ниже и нажмите кнопку с галочкой.
<p align="center"><img src="images\api_permissions.jpg" width=90%/></p>

4. Кликните по имени созданного API. Вы попадете на страницу **Скрипт**. Здесь вы можете ввести код скрипта на JavaScript, который выполняется при осуществлении GET-запроса по адресу **http://<имя вашей мобильной службы>.azure-mobile.net/api/<имя вашего API>**, например, если в точности следовать рисункам в данном руководстве, то получится адрес **http://tessel-demo.azure-mobile.net/api/dev_api**. Если вы не знакомы с протоколом HTTP и не знаете, что такое GET-запрос, ознакомьтесь [со статьей](https://ru.wikipedia.org/wiki/HTTP).

5. Удалите весь код из окна **Скрипт** и скопируйте на его место код из материалов руководства [api.js](code\api.js). Ознакомьтесь с кодом.

6. Найдите в начале кода строку
```
var table_name = "<put your table name here>";
```
и отредактируйте ее, поместив в переменную название вашей таблицы мобильной службы. Внизу экрана нажмите кнопку **Сохранить**.

## Проверка работы мобильной службы с помощью браузера

1. Запустите любой браузер (или создайте вкладку, если браузер открыт) и наберите в строке URL, заменив идентификаторы в угловых скобках на идентификаторы, соответствующие вашей службе:
```
http://<имя вашей мобильной службы>.azure-mobile.net/api/<имя вашего API>
```
например:
```
http://tessel-demo.azure-mobile.net/api/dev_api
```
В зависимости от браузера и его настроек, вы можете увидеть одно из сообщений, показанных на рисунках ниже (код 403 или 
сообщение *{"message":"No device"}* - признак правильной работы скрипта).
<p align="center"><img src="images\nodevice_403.jpg" width=90%/></p>
<p align="center"><img src="images\nodevice_json.jpg"/></p>
> Скрипт передает сообщение в элементе JSON. Это необходимо для обеспечения совместимости с любыми IoT-устройствами, пользующимися API, так как они будут ожидать от сервиса ответ именно в таком формате. При этом свойство Content-Type устанавливается в text/plain, что облегчает ознакомление со скриптом при использовании браузера.

2. Проверьте работу скрипта, набрав URL
```
http://<имя вашей мобильной службы>.azure-mobile.net/api/<имя вашего API>?deviceid=test_id&t=0.0&rh=0.0
```
В браузере появится сообщение, показанное на рисунке ниже.
<p align="center"><img src="images\api_created.jpg"/></p>

3. Наберите еще раз тот же URL. На этот раз в браузере появятся данные, возвращенные API. Поскольку мы ранее не задавали значения для столбцов led0, led1, то они будут обозначены как пустые (null).
<p align="center"><img src="images\api_data.jpg"/></p>

4. Вернитесь к порталу управления Azure и выберите мобильную службу. Перейдите на страницу **Журналы**. Убедитесь, что скрипт выполнил журналирование операций.

## Обсуждение

#### Почему для обмена с IoT-устройством используется таблица мобильных служб, а не другие варианты хранилищ данных Azure
Сохранение данных в таблице мобильной службы Azure позволяет с легкостью передавать их в мобильное приложение.

#### Почему поле идентификатора пользователя зарезервировано для будущего использования
Вам будет предложено добавить аутентификацию пользователей в конце данного руководства. Таблица уже будет готова к этому.

#### Почему IoT устройство предполагается использовать как клиент, подключающийся к службам Azure, а не веб-сервер с прямой отдачей данных
- При наличии большого количества таких устройств представление каждого в виде сервера значительно усложнит сбор данных и централизованное управление;
- Если устройства используются не в локальной сети, а в Интернет, каждому из них понадобится внешний IP-адрес или соответствующая настройка сетевого оборудования, что вызовет дополнительные сложности;
- Подключение большого количества устройств к одной службе Azure позволяет централизованно собирать с них данные и передавать их в другие службы Azure и мобильные приложения, а также централизованно управлять устройствами.

#### Зачем нужен собственный API мобильной службы, если существует готовый REST API
- Использование собственного API проще и понятнее для реализации соединения IoT-устройства и мобильной службы, особенно при наличии аутентификации пользователей;
- Дополнительное преимущество: скрытие ненужных для IoT-устройства деталей API при реализации собственного API.

## Пути улучшения (не обязательно к выполнению)

1. Подумайте, какие преимущества может иметь использование POST вместо GET-запроса.

2. Обратите внимание, что в скрипте API были использованы SQL запросы, а не работа с таблицами напрямую с помощью express.JS. Второй подход может быть оптимальнее, если вы знакомы с express.JS. Подумайте, как реализовать второй подход в данном случае.

3. Подумайте над безопасностью данного решения. Можно ли ее улучшить?
